package saa.dominio.disciplina;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;

import saa.dominio.Curso;
import saa.dominio.periodo.OfertaDisciplina;

@Entity
@NamedQueries({
    @NamedQuery(name = "Disciplina.id", query = "SELECT d FROM Disciplina d WHERE d.id = :id")})
public class Disciplina implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String nome;
    private int cargaHorariaRelogio;
    private int cargaHorariaAula;
    private String descricao;

    @ManyToOne
    private Curso curso;
    @ManyToOne
    private Area area;
    @ManyToMany
    private Set<Categoria> categorias;

    @ManyToMany
    private Set<Disciplina> preRequisitos;

    @OrderBy(value="semestre")
    @OneToMany(mappedBy = "disciplina")
    private Set<OfertaDisciplina> ofertas;

    public Disciplina() {
    }

    public Disciplina(String nome, int cargaHorariaRelogio, int cargaHorariaAula, String descricao, Curso curso) {
        this.nome = nome;
        this.cargaHorariaRelogio = cargaHorariaRelogio;
        this.cargaHorariaAula = cargaHorariaAula;
        this.descricao = descricao;
        this.curso = curso;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getCargaHorariaRelogio() {
        return cargaHorariaRelogio;
    }

    public void setCargaHorariaRelogio(int cargaHorariaRelogio) {
        this.cargaHorariaRelogio = cargaHorariaRelogio;
    }

    public Set<Disciplina> getPreRequisitos() {
        return preRequisitos;
    }

    public void setPreRequisitos(Set<Disciplina> preRequisitos) {
        this.preRequisitos = preRequisitos;
    }

    public void addPreRequisito(Disciplina preRequisito) {
        this.preRequisitos.add(preRequisito);
    }

    public int getCargaHorariaAula() {
        return cargaHorariaAula;
    }

    public void setCargaHorariaAula(int cargaHorariaAula) {
        this.cargaHorariaAula = cargaHorariaAula;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Curso getCurso() {
        return curso;
    }

    public void setCurso(Curso curso) {
        this.curso = curso;
    }

    public Area getArea() {
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }

    public Set<Categoria> getCategorias() {
        return categorias;
    }

    public void setCategorias(Set<Categoria> categorias) {
        this.categorias = categorias;
    }

    public void addCategoria(Categoria categoria) {
        this.categorias.add(categoria);
    }

    public Set<OfertaDisciplina> getOfertas() {
        return ofertas;
    }

    public void setOfertas(Set<OfertaDisciplina> ofertas) {
        this.ofertas = ofertas;
    }

    public void addOferta(OfertaDisciplina oferta) {
        this.ofertas.add(oferta);
    }
}
